#!/usr/bin/env python
# -*- coding: utf-8 -*-

'''自定义上下文管理器来实现int类型的list
__enter__: 返回值赋值给as后面指定的变量
__exit__: 退出with上下文时执行，一般用作资源回收
'''

class IntList(list):
    def __init__(self, seq=()):
        for elm in seq:
            if not isinstance(elm, int):
                raise TypeError('element must be type of int')
        super().__init__(seq)
    def append(self, obj):
        if isinstance(obj, int):
            super().append(obj)
            return None
        raise TypeError('element must be type of int')
    def __enter__(self):
        self._copy = IntList(self)
        return self._copy
    def __exit__(self, exc_type, exc_val, exc_tb):
        print(exc_type) #<class 'TypeError'>
        print(exc_val) #element must be type of int
        print(exc_tb)  #<traceback object at 0x7f2ef2b79188>
        if exc_type is None:
            '''上下文执行没异常'''
            self[:] = self._copy #将列表副本的元素重新赋值给原始列表
        del (self._copy)#回收掉列表的副本
        return False
item = IntList([1,2,3])
try:
    with item as iList:
        iList.append(4)
        iList.append(5)
        iList.append("6")       # 此处会抛出异常，一旦出现异常，前面两句append的修改也失效，原始item的元素不变，
                                # 因此可以保证事务的完整性
except:
    pass
print(item)